home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 5
/
Aminet 5 - March 1995.iso
/
Aminet
/
misc
/
amag
/
AM9404_2.lha
/
tips & tricks
/
remtd.asm
< prev
next >
Wrap
Assembly Source File
|
1994-02-28
|
3KB
|
104 lines
; *** Includes laden (Pfad individuell setzen!) ***
INCDIR maxon:include/
INCLUDE exec/exec_lib.i
INCLUDE exec/execbase.i
INCLUDE exec/tasks.i
;--- Nur bei Start von WBench nötig: ----
INCLUDE startup.asm
*************************************
* RemTD *
*-----------------------------------*
* Funktion: Schaltet Laufwerke ab *
* (friert sie ein). Bei nochmaligem *
* Aufruf werden diese wieder *
* aktiviert. *
* Eingabe : ------------- *
* Ausgabe : ------------- *
* Aufruf : *
* CLI/Shell: RemTD ohne Argumente *
* Workbench: Piktogramm *
*************************************
Main
lea TaskName(pc),a5
lea TDBasis(pc),a4
move.l $4.w,a6
jsr _LVODisable(a6) ;System einfrieren
.loop
move.l a5,a1
jsr _LVOFindTask(a6) ;TD suchen
tst.l d0 ;gefunden?
beq.s .notd ;Nein -> ab!
move.l d0,a1 ;Ja -> Basis nach a1
cmp.b #8,TC_STATE(a1) ;Task schon gefroren?
beq.s .makeactive ;Ja -> aktivieren
;Nein -> einfrieren
moveq #0,d7 ;Flag, TD in TaskWait-Liste
move.b #8,TC_STATE(A1) ;TS_FROZEN nach Statusflag
.remtd
move.l a1,(a4)+ ;in eigene Liste eintragen
jsr _LVORemove(a6) ;Basis aus System entfernen
bra.s .loop ;Weiter, bis Ende...
;--- Task aktivieren ---
.makeactive
moveq #1,d7 ;Flag, TD in TaskReady-Liste
move.b #TS_READY,TC_STATE(a1) ;Ready als Status
bra.s .remtd ;und Liste entfernen
.notd
lea TDBasis(pc),a4 ;Eigene Liste nach a4
lea TaskWait(a6),a3 ;TaskWait-Liste aus Exec
tst d7 ;Flag testen
beq.s .loopinit ;False -> Liste übernehmen
lea TaskReady(a6),a3 ;sonst TaskReady-Liste
.loopinit
tst.l (a4) ;Einträge vorhanden?
beq.s .norm ;nein-> normal weiter
.loopins move.l (a4)+,a1 ;node holen
move.l a3,a0 ;Liste nach a0
jsr _LVOEnqueue(a6) ;Node in Liste einfügen
tst.l (a4) ;weitere Node vorhanden?
beq.s .norm ;Nein -> normal weiter
bra.s .loopins ;sonst Schleifenanfang
.norm
jsr _LVOEnable(a6) ;System wecken
suba.l a1,a1 ;Eigenen Task suchen
jsr _LVOFindTask(a6)
move.l d0,a1 ;-> nach a1
tst.l d0 ;nicht gefunden
beq.s .weg ;dann Ende
moveq #0,d0 ;Rescheduling durchführen
move.b LN_PRI(a1),d0 ;damit modifizierte Liste
jsr _LVOSetTaskPri(a6) ;anerkannt wird...
.weg
moveq #0,d0 ;Return-Flag setzen
rts ;und weg...
;*** Namen und Strukturen ***
TaskName
dc.b "trackdisk.device",0
even
;--- genügend Platz für TD-Basen lassen ---
TDBasis
dc.l 0,0,0,0,0,0 ;man weiß nie!
VersionsString:
dc.b "$VER: RemTD V0.5 (24.12.93)"
even